package com.lxw.question;

public class Q02 {
    /**
     * 题目描述
     * 给定两个整数，被除数 dividend 和除数 divisor。将两数相除，要求不使用乘法、除法和 mod 运算符。
     * <p>
     * 返回被除数 dividend 除以除数 divisor 得到的商。
     * <p>
     * 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
     * 链接：https://leetcode-cn.com/problems/divide-two-integers
     */
    public static int divide(int dividend, int divisor) {
        //特殊情况
        if(dividend == 0)
            return 0;
        //判断最终结果是负数，还是正数。
        boolean isNegative = ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0) );
        /**
         * java中int取值范围 (-2147483648 ~ 2147483647)
         */
        //为了避开烦人的越界问题
        long dividend1 = dividend;
        long divisor1 = divisor;
        long shang = 0;

        long dividend1Pure = Math.abs(dividend1);
        long divisor1Pure = Math.abs(divisor1);
        if(dividend1Pure - divisor1Pure < 0){
            return 0;
        }

        //集中解决除数绝对值为1的情况
        if(divisor1Pure == 1){
            shang = divisor1 > 0 ? dividend1 : -dividend1;
            if(shang > Integer.MAX_VALUE){
                return (int)(shang-1);
            } else{
                return (int) shang;
            }
        }

        shang = div(dividend1Pure,divisor1Pure);
        shang = isNegative ? -shang : shang;

        //解决正整数越界的问题。
        if(shang >= Integer.MAX_VALUE){
           return (int)(shang-1);
        }

        return (int)shang;
    }

    public static long div(long dividend,long divisor){
        long yushu = dividend;
        long shang = 0;
        while(yushu >= divisor){
            yushu = yushu - divisor;
            shang++;
        }
        return shang;
    }

    public static void main(String[] args) {
        System.out.println("开始测试...");
        int result = divide(2147483647,1);
        System.out.println(result);
        //System.out.println(Integer.MIN_VALUE);2147483647
        //1
    }
}
